gint *prec);
static GdkVisual *system_visual = NULL;
+static GdkVisual *rgba_visual = NULL;
static gint available_depths[1];
static GdkVisualType available_types[1];
-void
-_gdk_visual_init (GdkScreen *screen)
+static void
+_gdk_visual_init_internal (GdkScreen *screen, gboolean is_rgba)
{
+ GdkVisual *visual;
struct
{
BITMAPINFOHEADER bi;
gint bitspixel = GetDeviceCaps (_gdk_display_hdc, BITSPIXEL);
gint map_entries = 0;
- system_visual = g_object_new (GDK_TYPE_VISUAL, NULL);
- system_visual->screen = screen;
+ visual = g_object_new (GDK_TYPE_VISUAL, NULL);
+ visual->screen = screen;
if (rastercaps & RC_PALETTE)
{
const int sizepalette = GetDeviceCaps (_gdk_display_hdc, SIZEPALETTE);
gchar *max_colors = getenv ("GDK_WIN32_MAX_COLORS");
- system_visual->type = GDK_VISUAL_PSEUDO_COLOR;
+ visual->type = GDK_VISUAL_PSEUDO_COLOR;
g_assert (sizepalette == 256);
if (map_entries < 32)
{
map_entries = 16;
- system_visual->type = GDK_VISUAL_STATIC_COLOR;
+ visual->type = GDK_VISUAL_STATIC_COLOR;
bitspixel = 4;
}
else if (map_entries < 64)
else if (bitspixel == 1 && numcolors == 16)
{
bitspixel = 4;
- system_visual->type = GDK_VISUAL_STATIC_COLOR;
+ visual->type = GDK_VISUAL_STATIC_COLOR;
map_entries = 16;
}
else if (bitspixel == 1)
{
- system_visual->type = GDK_VISUAL_STATIC_GRAY;
+ visual->type = GDK_VISUAL_STATIC_GRAY;
map_entries = 2;
}
else if (bitspixel == 4)
{
- system_visual->type = GDK_VISUAL_STATIC_COLOR;
+ visual->type = GDK_VISUAL_STATIC_COLOR;
map_entries = 16;
}
else if (bitspixel == 8)
{
- system_visual->type = GDK_VISUAL_STATIC_COLOR;
+ visual->type = GDK_VISUAL_STATIC_COLOR;
map_entries = 256;
}
else if (bitspixel == 16)
{
- system_visual->type = GDK_VISUAL_TRUE_COLOR;
+ visual->type = GDK_VISUAL_TRUE_COLOR;
#if 1
/* This code by Mike Enright,
* see http://www.users.cts.com/sd/m/menright/display.html
{
/* It's 555 */
bitspixel = 15;
- system_visual->red_mask = 0x00007C00;
- system_visual->green_mask = 0x000003E0;
- system_visual->blue_mask = 0x0000001F;
+ visual->red_mask = 0x00007C00;
+ visual->green_mask = 0x000003E0;
+ visual->blue_mask = 0x0000001F;
}
else
{
allmasks/=2;
}
bitspixel = k;
- system_visual->red_mask = bmi.u.fields[0];
- system_visual->green_mask = bmi.u.fields[1];
- system_visual->blue_mask = bmi.u.fields[2];
+ visual->red_mask = bmi.u.fields[0];
+ visual->green_mask = bmi.u.fields[1];
+ visual->blue_mask = bmi.u.fields[2];
}
#else
/* Old, incorrect (but still working) code. */
#if 0
- system_visual->red_mask = 0x0000F800;
- system_visual->green_mask = 0x000007E0;
- system_visual->blue_mask = 0x0000001F;
+ visual->red_mask = 0x0000F800;
+ visual->green_mask = 0x000007E0;
+ visual->blue_mask = 0x0000001F;
#else
- system_visual->red_mask = 0x00007C00;
- system_visual->green_mask = 0x000003E0;
- system_visual->blue_mask = 0x0000001F;
+ visual->red_mask = 0x00007C00;
+ visual->green_mask = 0x000003E0;
+ visual->blue_mask = 0x0000001F;
#endif
#endif
}
else if (bitspixel == 24 || bitspixel == 32)
{
- bitspixel = 24;
- system_visual->type = GDK_VISUAL_TRUE_COLOR;
- system_visual->red_mask = 0x00FF0000;
- system_visual->green_mask = 0x0000FF00;
- system_visual->blue_mask = 0x000000FF;
+ if (!is_rgba)
+ bitspixel = 24;
+ visual->type = GDK_VISUAL_TRUE_COLOR;
+ visual->red_mask = 0x00FF0000;
+ visual->green_mask = 0x0000FF00;
+ visual->blue_mask = 0x000000FF;
}
else
g_error ("_gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
- system_visual->depth = bitspixel;
- system_visual->byte_order = GDK_LSB_FIRST;
- system_visual->bits_per_rgb = 42; /* Not used? */
+ visual->depth = bitspixel;
+ visual->byte_order = GDK_LSB_FIRST;
+ visual->bits_per_rgb = 42; /* Not used? */
- if ((system_visual->type == GDK_VISUAL_TRUE_COLOR) ||
- (system_visual->type == GDK_VISUAL_DIRECT_COLOR))
+ if ((visual->type == GDK_VISUAL_TRUE_COLOR) ||
+ (visual->type == GDK_VISUAL_DIRECT_COLOR))
{
- gdk_visual_decompose_mask (system_visual->red_mask,
- &system_visual->red_shift,
- &system_visual->red_prec);
-
- gdk_visual_decompose_mask (system_visual->green_mask,
- &system_visual->green_shift,
- &system_visual->green_prec);
-
- gdk_visual_decompose_mask (system_visual->blue_mask,
- &system_visual->blue_shift,
- &system_visual->blue_prec);
- map_entries = 1 << (MAX (system_visual->red_prec,
- MAX (system_visual->green_prec,
- system_visual->blue_prec)));
+ gdk_visual_decompose_mask (visual->red_mask,
+ &visual->red_shift,
+ &visual->red_prec);
+
+ gdk_visual_decompose_mask (visual->green_mask,
+ &visual->green_shift,
+ &visual->green_prec);
+
+ gdk_visual_decompose_mask (visual->blue_mask,
+ &visual->blue_shift,
+ &visual->blue_prec);
+ map_entries = 1 << (MAX (visual->red_prec,
+ MAX (visual->green_prec,
+ visual->blue_prec)));
}
else
{
- system_visual->red_mask = 0;
- system_visual->red_shift = 0;
- system_visual->red_prec = 0;
+ visual->red_mask = 0;
+ visual->red_shift = 0;
+ visual->red_prec = 0;
- system_visual->green_mask = 0;
- system_visual->green_shift = 0;
- system_visual->green_prec = 0;
+ visual->green_mask = 0;
+ visual->green_shift = 0;
+ visual->green_prec = 0;
- system_visual->blue_mask = 0;
- system_visual->blue_shift = 0;
- system_visual->blue_prec = 0;
+ visual->blue_mask = 0;
+ visual->blue_shift = 0;
+ visual->blue_prec = 0;
}
- system_visual->colormap_size = map_entries;
+ visual->colormap_size = map_entries;
+
+ available_depths[0] = visual->depth;
+ available_types[0] = visual->type;
- available_depths[0] = system_visual->depth;
- available_types[0] = system_visual->type;
+ if (is_rgba)
+ rgba_visual = visual;
+ else
+ system_visual = visual;
+}
+
+void
+_gdk_visual_init (GdkScreen *screen)
+{
+ _gdk_visual_init_internal (screen, FALSE);
+ _gdk_visual_init_internal (screen, TRUE);
}
gint
return system_visual;
}
+GdkVisual *
+_gdk_win32_screen_get_rgba_visual (GdkScreen *screen)
+{
+ return rgba_visual;
+}
+
GdkVisual*
_gdk_win32_screen_visual_get_best (GdkScreen *screen)
{
- return ((GdkVisual*) system_visual);
+ return ((GdkVisual*) rgba_visual);
}
GdkVisual*
_gdk_win32_screen_visual_get_best_with_depth (GdkScreen *screen, gint depth)
{
- if (depth == system_visual->depth)
+ if (depth == rgba_visual->depth)
+ return (GdkVisual*) rgba_visual;
+ else if (depth == system_visual->depth)
return (GdkVisual*) system_visual;
else
return NULL;
GdkVisual*
_gdk_win32_screen_visual_get_best_with_type (GdkScreen *screen, GdkVisualType visual_type)
{
- if (visual_type == system_visual->type)
+ if (visual_type == rgba_visual->type)
+ return rgba_visual;
+ else if (visual_type == system_visual->type)
return system_visual;
else
return NULL;
gint depth,
GdkVisualType visual_type)
{
- if ((depth == system_visual->depth) && (visual_type == system_visual->type))
+ if ((depth == rgba_visual->depth) && (visual_type == rgba_visual->type))
+ return rgba_visual;
+ else if ((depth == system_visual->depth) && (visual_type == system_visual->type))
return system_visual;
else
return NULL;
GList*
_gdk_win32_screen_list_visuals (GdkScreen *screen)
{
- return g_list_append (NULL, (gpointer) system_visual);
+ GList *result = NULL;
+
+ result = g_list_append (result, (gpointer) rgba_visual);
+ result = g_list_append (result, (gpointer) system_visual);
+
+ return result;
}
static void
#include "gdkglcontext-win32.h"
#include <cairo-win32.h>
+#include <dwmapi.h>
static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
GDK_NOTE (MISC, g_print ("_gdk_root=%p\n", GDK_WINDOW_HWND (_gdk_root)));
}
+gboolean
+_gdk_win32_window_enable_transparency (GdkWindow *window)
+{
+ DWM_BLURBEHIND blur_behind;
+ HRGN empty_region;
+ HRESULT call_result;
+ HWND parent, thiswindow;
+
+ if (window == NULL || GDK_WINDOW_HWND (window) == NULL)
+ return FALSE;
+
+ if (!gdk_screen_is_composited (gdk_window_get_screen (window)))
+ return FALSE;
+
+ if (window == _gdk_root)
+ return FALSE;
+
+ thiswindow = GDK_WINDOW_HWND (window);
+
+ /* Blurbehind only works on toplevel windows */
+ parent = GetAncestor (thiswindow, GA_PARENT);
+ if (!(GetWindowLong (thiswindow, GWL_STYLE) & WS_POPUP) &&
+ (parent == NULL || parent != GetDesktopWindow ()))
+ return FALSE;
+
+ empty_region = CreateRectRgn (0, 0, -1, -1);
+
+ if (empty_region == NULL)
+ return FALSE;
+
+ memset (&blur_behind, 0, sizeof (blur_behind));
+ blur_behind.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
+ blur_behind.hRgnBlur = empty_region;
+ blur_behind.fEnable = TRUE;
+ call_result = DwmEnableBlurBehindWindow (thiswindow, &blur_behind);
+
+ if (!SUCCEEDED (call_result))
+ g_warning ("%s: %s (%p) failed: %" G_GINT32_MODIFIER "x",
+ G_STRLOC, "DwmEnableBlurBehindWindow", thiswindow, (guint32) call_result);
+
+ DeleteObject (empty_region);
+
+ return SUCCEEDED (call_result);
+}
+
static const gchar *
get_default_title (void)
{
window->impl = GDK_WINDOW_IMPL (impl);
if (attributes_mask & GDK_WA_VISUAL)
- g_assert (gdk_screen_get_system_visual (screen) == attributes->visual);
+ g_assert ((gdk_screen_get_system_visual (screen) == attributes->visual) ||
+ (gdk_screen_get_rgba_visual (screen) == attributes->visual));
impl->override_redirect = override_redirect;
if (attributes_mask & GDK_WA_CURSOR)
gdk_window_set_cursor (window, attributes->cursor);
+
+ _gdk_win32_window_enable_transparency (window);
}
GdkWindow *
if (!hdc)
return NULL;
- impl->cairo_surface = cairo_win32_surface_create (hdc);
+ impl->cairo_surface = cairo_win32_surface_create_with_format (hdc, CAIRO_FORMAT_ARGB32);
cairo_surface_set_user_data (impl->cairo_surface, &gdk_win32_cairo_key,
impl, gdk_win32_cairo_surface_destroy);